Select pres dve tabulky
Otázka od: tomsir1.edu@mail.cez.cz
2. 10. 2002 16:32
Ahoj,
mam dve tabulky :
tab1 : id_osoby, jmeno
tab2 : id_osoby, id_zbozi,popis_zbozi
potrebuju udelat select pres obe tabulky tak aby mi dotaz vratil vypis
vsech osob z tab1 a jim odpovidajici polozky z tab2. V pripade, kdy v tab2
neexistuje odpovidajici polozka pro radek z tab1, potrebuji aby vysledkem
dotazu byl pouze obsah radku z tab1 doplneny o nulove hodnoty, nejak takto
:
id_osoby, jmeno, id_zbozi,
popis_zbozi
1 Novak 1
vrtacka
1 Novak 2
kladivo
2 Novakova 0
3 Trouba 1
vrtacka
atd ... doufam ze je to pochopitelny ...
Pripadne jak by to bylo pres tri tabulky ... napr. jeste by se dal
rozlisit dodavatel zbozi /s tim ze ho nekde nezadam/
Diky Radek
Odpovedá: ing. Jan Fiala
2. 10. 2002 13:56
Nepises, na jake databazi.
Zkus se podivat na klauzuli Left Outer Join. To by melo byt to, co
potrebujes.
--
ing. Jan Fiala
mailto:jan.fiala@iol.cz
2.10.2002 tomsir1.edu@mail.cez.cz:
> mam dve tabulky :
> tab1 : id_osoby, jmeno
> tab2 : id_osoby, id_zbozi,popis_zbozi
> potrebuju udelat select pres obe tabulky tak aby mi dotaz vratil vypis
> vsech osob z tab1 a jim odpovidajici polozky z tab2. V pripade, kdy v tab2
> neexistuje odpovidajici polozka pro radek z tab1, potrebuji aby vysledkem
> dotazu byl pouze obsah radku z tab1 doplneny o nulove hodnoty, nejak takto
Odpovedá: Ing. Jiri SOKOL
2. 10. 2002 14:17
> tab1 : id_osoby, jmeno
> tab2 : id_osoby, id_zbozi,popis_zbozi
>
> potrebuju udelat select pres obe tabulky tak aby mi dotaz vratil vypis
> vsech osob z tab1 a jim odpovidajici polozky z tab2. V pripade, kdy v tab2
> neexistuje odpovidajici polozka pro radek z tab1, potrebuji aby vysledkem
> dotazu byl pouze obsah radku z tab1 doplneny o nulove hodnoty, nejak takto
> :
>
>
> id_osoby, jmeno, id_zbozi,
> popis_zbozi
>
> 1 Novak 1
> vrtacka
> 1 Novak 2
> kladivo
> 2 Novakova 0
> 3 Trouba 1
> vrtacka
>
zkus tohle:
SELECT id_osoby, jmeno, id_zbozi, popis_zbozi FROM tab1, tab2 WHERE
tab1.id_osoby=tab2.id_osoby;
> atd ... doufam ze je to pochopitelny ...
> Pripadne jak by to bylo pres tri tabulky ... napr. jeste by se dal
> rozlisit dodavatel zbozi /s tim ze ho nekde nezadam/
>
se trema by to melo byt identicke:
SELECT id_osoby, jmeno, id_zbozi, popis_zbozi, id_dodavatele, nazev_dodavatele
FROM tab1, tab2,
tab3 WHERE (tab1.id_osoby=tab2.id_osoby)AND(tab2.id_zbozi=tab3.id_zbozi);
kde je predpoklad existence tabulky: Tab3, ktera ma minimalne sloupce:
id_zbozi, id_dodavatele,
nazev_dodavatele.
>
> Diky Radek
>
Ahoj Jirka
Ing. Jiri Sokol, js-delphi@seznam.cz, +420251431187
D6ProfSP2,WinNT
amatersky
programator
______________________________________________________________________
Reklama:
Kam do kina ci divadla? http://kultura.seznam.cz
Odpovedá: ing. Jan Fiala
2. 10. 2002 13:29
2.10.2002 Ing. Jiri SOKOL:
>> tab1 : id_osoby, jmeno
>> tab2 : id_osoby, id_zbozi,popis_zbozi
>>
>> potrebuju udelat select pres obe tabulky tak aby mi dotaz vratil vypis
>> vsech osob z tab1 a jim odpovidajici polozky z tab2. V pripade, kdy v tab2
>> neexistuje odpovidajici polozka pro radek z tab1, potrebuji aby vysledkem
>> dotazu byl pouze obsah radku z tab1 doplneny o nulove hodnoty, nejak takto
> SELECT id_osoby, jmeno, id_zbozi, popis_zbozi FROM tab1, tab2 WHERE
tab1.id_osoby=tab2.id_osoby;
Tohle nevybere zaznamy, ktere nejsou v tab2, ale pouze ty, ktere jsou
v obou tabulkach. K tomu prave slouzi Left Outer Join
--
ing. Jan Fiala
mailto:jan.fiala@iol.cz
Odpovedá: Ludo Fulop
2. 10. 2002 12:59
SELECT *, (SELECT id_zbozi, popis_zbozi FROM tab2 WHERE
id_osoby=tab1.id_osoby) FROM tab1
Ludo Fulop
----- Original Message -----
From: <tomsir1.edu@mail.cez.cz>
To: <delphi-l@clexpert.cz>
Sent: Wednesday, October 02, 2002 11:17 AM
Subject: Select pres dve tabulky
>
> Ahoj,
>
> mam dve tabulky :
>
> tab1 : id_osoby, jmeno
> tab2 : id_osoby, id_zbozi,popis_zbozi
>
> potrebuju udelat select pres obe tabulky tak aby mi dotaz vratil vypis
> vsech osob z tab1 a jim odpovidajici polozky z tab2. V pripade, kdy v tab2
> neexistuje odpovidajici polozka pro radek z tab1, potrebuji aby vysledkem
> dotazu byl pouze obsah radku z tab1 doplneny o nulove hodnoty, nejak takto
> :
>
>
> id_osoby, jmeno, id_zbozi,
> popis_zbozi
>
> 1 Novak 1
> vrtacka
> 1 Novak 2
> kladivo
> 2 Novakova 0
> 3 Trouba 1
> vrtacka
>
>
> atd ... doufam ze je to pochopitelny ...
> Pripadne jak by to bylo pres tri tabulky ... napr. jeste by se dal
> rozlisit dodavatel zbozi /s tim ze ho nekde nezadam/
>
>
>
> Diky Radek
>
>
>
>
Odpovedá: Ludo Fulop
2. 10. 2002 14:03
----- Original Message -----
From: "Ing. Jiri SOKOL" <JS-delphi@seznam.cz>
> potrebuju udelat select pres obe tabulky tak aby mi dotaz vratil vypis
> vsech osob z tab1 a jim odpovidajici polozky z tab2. V pripade, kdy v tab2
> neexistuje odpovidajici polozka pro radek z tab1, potrebuji aby vysledkem
> dotazu byl pouze obsah radku z tab1 doplneny o nulove hodnoty, nejak takto
>> zkus tohle:
>> SELECT id_osoby, jmeno, id_zbozi, popis_zbozi FROM tab1, tab2 WHERE
tab1.id_osoby=tab2.id_osoby;
toto vsak nevrati obsah riadku z tab1, pre ktory nie je zaznam v tab2..
Ludo Fulop
Odpovedá: Aleš Kerner
2. 10. 2002 16:51
Myslim si, ze takhle to nepujde, ty nulove by se tam nevyskytly, musí to byt
myslim pres left join
SELECT id_osoby, jmeno, id_zbozi, popis_zbozi FROM tab1, tab2 WHERE
tab1.id_osoby=tab2.id_osoby;
SELECT id_osoby, jmeno, id_zbozi, popis_zbozi, id_dodavatele,
nazev_dodavatele FROM tab1, tab2,
tab3 WHERE (tab1.id_osoby=tab2.id_osoby)AND(tab2.id_zbozi=tab3.id_zbozi);
tohle co uvadis je obdoba Inner Join
Ales
----- Original Message -----
From: "Ing. Jiri SOKOL" <JS-delphi@seznam.cz>
To: <delphi-l@clexpert.cz>
Sent: Wednesday, October 02, 2002 12:06 PM
Subject: Re: Select pres dve tabulky
> tab1 : id_osoby, jmeno
> tab2 : id_osoby, id_zbozi,popis_zbozi
>
> potrebuju udelat select pres obe tabulky tak aby mi dotaz vratil vypis
> vsech osob z tab1 a jim odpovidajici polozky z tab2. V pripade, kdy v tab2
> neexistuje odpovidajici polozka pro radek z tab1, potrebuji aby vysledkem
> dotazu byl pouze obsah radku z tab1 doplneny o nulove hodnoty, nejak takto
> :
>
>
> id_osoby, jmeno, id_zbozi,
> popis_zbozi
>
> 1 Novak 1
> vrtacka
> 1 Novak 2
> kladivo
> 2 Novakova 0
> 3 Trouba 1
> vrtacka
>
zkus tohle:
SELECT id_osoby, jmeno, id_zbozi, popis_zbozi FROM tab1, tab2 WHERE
tab1.id_osoby=tab2.id_osoby;
> atd ... doufam ze je to pochopitelny ...
> Pripadne jak by to bylo pres tri tabulky ... napr. jeste by se dal
> rozlisit dodavatel zbozi /s tim ze ho nekde nezadam/
>
se trema by to melo byt identicke:
SELECT id_osoby, jmeno, id_zbozi, popis_zbozi, id_dodavatele,
nazev_dodavatele FROM tab1, tab2,
tab3 WHERE (tab1.id_osoby=tab2.id_osoby)AND(tab2.id_zbozi=tab3.id_zbozi);
kde je predpoklad existence tabulky: Tab3, ktera ma minimalne sloupce:
id_zbozi, id_dodavatele,
nazev_dodavatele.
>
> Diky Radek
>
Ahoj Jirka
Ing. Jiri Sokol, js-delphi@seznam.cz, +420251431187
D6ProfSP2,WinNT
amatersky
programator
______________________________________________________________________
Reklama:
Kam do kina ci divadla? http://kultura.seznam.cz
---
Odchozí zpráva neobsahuje viry.
Zkontrolováno antivirovým systémem AVG (http://www.grisoft.cz).
Verze: 6.0.393 / Virová báze: 223 - datum vydání: 30.9.2002
Odpovedá: Lstiburek Pavel
2. 10. 2002 13:29
> Od: Ing. Jiri SOKOL [mailto:JS-delphi@seznam.cz]
> > tab1 : id_osoby, jmeno
> > tab2 : id_osoby, id_zbozi,popis_zbozi
> >
> > potrebuju udelat select pres obe tabulky tak aby mi dotaz
> vratil vypis
> > vsech osob z tab1 a jim odpovidajici polozky z tab2. V
> pripade, kdy v tab2
> > neexistuje odpovidajici polozka pro radek z tab1, potrebuji
> aby vysledkem
> > dotazu byl pouze obsah radku z tab1 doplneny o nulove
> hodnoty
> zkus tohle:
>
> SELECT id_osoby, jmeno, id_zbozi, popis_zbozi FROM tab1, tab2
> WHERE tab1.id_osoby=tab2.id_osoby;
>
> > atd ... doufam ze je to pochopitelny ...
> > Pripadne jak by to bylo pres tri tabulky ... napr. jeste by se dal
> > rozlisit dodavatel zbozi /s tim ze ho nekde nezadam/
> >
>
> se trema by to melo byt identicke:
>
> SELECT id_osoby, jmeno, id_zbozi, popis_zbozi, id_dodavatele,
> nazev_dodavatele FROM tab1, tab2,
> tab3 WHERE
> (tab1.id_osoby=tab2.id_osoby)AND(tab2.id_zbozi=tab3.id_zbozi);
>
> kde je predpoklad existence tabulky: Tab3, ktera ma minimalne
> sloupce: id_zbozi, id_dodavatele,
> nazev_dodavatele.
>
Bohuzel vysledek takto definovaneho dotazu vrazi pouze radky ktere vyhovuji
podmince a ostatni "zmizi".
Dotaz je treba napsat:
SELECT ... FROM tab1 LEFT OUTER JOIN tab2 ON tab1.id_osoby=tab2.id_osoby
Pro tri tabulky jsou dve moznosti (nejsou ale stejné!):
Pokud vypadaji relace:
a) tab1->tab2->tab3
SELECT ...
FROM tab1 LEFT OUTER JOIN tab2
LEFT OUTER JOIN tab3 ON tab2.id_zbozi = tab3.Id_zbozi ON
tab1.id_osoby=tab2.id_osoby
b) tab1-->tab2
+->tab3
SELECT ... FROM tab1 LEFT OUTER JOIN tab2 ON tab1.id_osoby=tab2.id_osoby
LEFT OUTER JOIN tab3 ON tab1.id_zbozi = tab3.Id_zbozi
PS: tu podminku pro pripojeni tab3 jsem si vymyslel !
Jinak doporucuji nejakou liteteraturu k SQL, nekde jsem mel v ruce
"Kapesniho pruvodce SQL" (nebo tak nejak), je to strucne a je tam "skoro"
vse o beznem SQL. To na co se ptas jsou "uplne" zaklady.
Pavel
Odpovedá: tomsir1.edu@mail.cez.cz
2. 10. 2002 17:08
Dik.
Sice to jsou "uplne" zaklady, ale jak vidis dle odezvy, tak nejen ja
/zacatecnik/ v tom nemam jasno. Vlastnim knihu Naucte se MySQL za 21 dni,
ale z popisu tam jsem moc moudry nebyl. Asi jsem to cetl malokrat ...
Radek
Lstiburek Pavel <Lstiburek@ceb.cz>@clexpert.cz on 02.10.2002 13:35:21
Odpovězte prosím - delphi-l@clexpert.cz
Odesláno kým: delphi-l-owner@clexpert.cz
Komu: "'delphi-l@clexpert.cz'" <delphi-l@clexpert.cz>
Kopie:
Předmět: RE: Select pres dve tabulky
> Od: Ing. Jiri SOKOL [mailto:JS-delphi@seznam.cz]
> > tab1 : id_osoby, jmeno
> > tab2 : id_osoby, id_zbozi,popis_zbozi
> >
> > potrebuju udelat select pres obe tabulky tak aby mi dotaz
> vratil vypis
> > vsech osob z tab1 a jim odpovidajici polozky z tab2. V
> pripade, kdy v tab2
> > neexistuje odpovidajici polozka pro radek z tab1, potrebuji
> aby vysledkem
> > dotazu byl pouze obsah radku z tab1 doplneny o nulove
> hodnoty
> zkus tohle:
>
> SELECT id_osoby, jmeno, id_zbozi, popis_zbozi FROM tab1, tab2
> WHERE tab1.id_osoby=tab2.id_osoby;
>
> > atd ... doufam ze je to pochopitelny ...
> > Pripadne jak by to bylo pres tri tabulky ... napr. jeste by se dal
> > rozlisit dodavatel zbozi /s tim ze ho nekde nezadam/
> >
>
> se trema by to melo byt identicke:
>
> SELECT id_osoby, jmeno, id_zbozi, popis_zbozi, id_dodavatele,
> nazev_dodavatele FROM tab1, tab2,
> tab3 WHERE
> (tab1.id_osoby=tab2.id_osoby)AND(tab2.id_zbozi=tab3.id_zbozi);
>
> kde je predpoklad existence tabulky: Tab3, ktera ma minimalne
> sloupce: id_zbozi, id_dodavatele,
> nazev_dodavatele.
>
Bohuzel vysledek takto definovaneho dotazu vrazi pouze radky ktere vyhovuji
podmince a ostatni "zmizi".
Dotaz je treba napsat:
SELECT ... FROM tab1 LEFT OUTER JOIN tab2 ON tab1.id_osoby=tab2.id_osoby
Pro tri tabulky jsou dve moznosti (nejsou ale stejné!):
Pokud vypadaji relace:
a) tab1->tab2->tab3
SELECT ...
FROM tab1 LEFT OUTER JOIN tab2
LEFT OUTER JOIN tab3 ON tab2.id_zbozi = tab3.Id_zbozi ON
tab1.id_osoby=tab2.id_osoby
b) tab1-->tab2
+->tab3
SELECT ... FROM tab1 LEFT OUTER JOIN tab2 ON tab1.id_osoby=tab2.id_osoby
LEFT OUTER JOIN tab3 ON tab1.id_zbozi = tab3.Id_zbozi
PS: tu podminku pro pripojeni tab3 jsem si vymyslel !
Jinak doporucuji nejakou liteteraturu k SQL, nekde jsem mel v ruce
"Kapesniho pruvodce SQL" (nebo tak nejak), je to strucne a je tam "skoro"
vse o beznem SQL. To na co se ptas jsou "uplne" zaklady.
Pavel
Odpovedá: Votava
2. 10. 2002 17:48
SELECT tab1.id_osoby,tab1.jmeno,tab2.id_zbozi,tab2.popis_zbozi FROM tab1
LEFT OUTER JOIN tab2 on tab1.id_osoby=tab2.id_osoby
s pozdravem Votava
>
> Ahoj,
>
> mam dve tabulky :
>
> tab1 : id_osoby, jmeno
> tab2 : id_osoby, id_zbozi,popis_zbozi
>
> potrebuju udelat select pres obe tabulky tak aby mi dotaz vratil vypis
> vsech osob z tab1 a jim odpovidajici polozky z tab2. V pripade, kdy v tab2
> neexistuje odpovidajici polozka pro radek z tab1, potrebuji aby vysledkem
> dotazu byl pouze obsah radku z tab1 doplneny o nulove hodnoty, nejak takto
> :
>
>
> id_osoby, jmeno, id_zbozi,
> popis_zbozi
>
> 1 Novak 1
> vrtacka
> 1 Novak 2
> kladivo
> 2 Novakova 0
> 3 Trouba 1
> vrtacka
>
>
> atd ... doufam ze je to pochopitelny ...
> Pripadne jak by to bylo pres tri tabulky ... napr. jeste by se dal
> rozlisit dodavatel zbozi /s tim ze ho nekde nezadam/
>
>
>
> Diky Radek
>
>
>
>
>
Odpovedá: David Michal
2. 10. 2002 14:31
select A.vse_co_chces_z_tab1, B.co_chces_z_tab2 From
tab1 A Left Outer Join tab2 B on (A.ID_Osoby = B.ID_Osoby)
David
----- Original Message -----
From: "Ing. Jiri SOKOL" <JS-delphi@seznam.cz>
> potrebuju udelat select pres obe tabulky tak aby mi dotaz vratil vypis
> vsech osob z tab1 a jim odpovidajici polozky z tab2. V pripade, kdy v tab2
> neexistuje odpovidajici polozka pro radek z tab1, potrebuji aby vysledkem
> dotazu byl pouze obsah radku z tab1 doplneny o nulove hodnoty, nejak takto
>> zkus tohle:
>> SELECT id_osoby, jmeno, id_zbozi, popis_zbozi FROM tab1, tab2 WHERE
tab1.id_osoby=tab2.id_osoby;
toto vsak nevrati obsah riadku z tab1, pre ktory nie je zaznam v tab2..
Ludo Fulop
---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.391 / Virus Database: 222 - Release Date: 19/09/2002
Odpovedá: Lstiburek Pavel
4. 10. 2002 12:32
Ty "uplne" zaklady nebyly mysleny nijak spatne, pouze jsem chtel tim rici,
ze je to mozne snadno nastudovat (a je to obecne pro libovolne SQL dotazy).
Velmi dobra je kniha "Mistrovstvi v Transact SQL", ta je, ale hodne
orientoana na MS SQL. Pomines-li jazyk T-SQL, ktery je internim jazykem SQL
serveru Microsoftu, tak 2/3 knihy jsou o zakladnich prikazech SQL = SELECT,
INSERT, UPDATE a DELETE, ktere respektuji doporuceni ISO (samozrejme s
odchylkami, jako u kazdeho velkeho dodavatele). Ja MySql nepouzivam, ale co
jsem slysel a cetl, tak vlastni DML je velmi blizke doporuceni ISO.
Pavel
> Dik.
> Sice to jsou "uplne" zaklady, ale jak vidis dle odezvy, tak nejen ja
> /zacatecnik/ v tom nemam jasno. Vlastnim knihu Naucte se
> MySQL za 21 dni,
> ale z popisu tam jsem moc moudry nebyl. Asi jsem to cetl malokrat ...
>
> Radek